#pragma once
#include <iostream>
#include <Log.h>
#include <Poller.h>
#include <functional>
// #include <pthread.h>
#include <thread>
#include <vector>
#include <mutex>
#include <sys/eventfd.h>
#include <timewheel.h>

namespace muduo{
    // class TimerWheel;
    class EventLoop{
    private:
        using functor = std::function<void()>;
        std::thread::id _thread_id;             //用来判断调用任务的线程是否是当前线程的成员变量
        Poller _poller;                         //所有描述符的事件监控
        int _event_fd;                          //用来唤醒监控IO事件（可能）导致的阻塞
        std::shared_ptr<Channel> _event_channel;                //管理_event_fd的Channel
        std::vector<functor> _taskqueue;        // 任务队列
        std::mutex _mutex;                      //用来保护对任务队列的操作

        TimerWheel* _timewheel;                 //定时器模块
    public:
        int Get_event_fd();
        EventLoop();
        // EventLoop的启动函数
        void start();
        // 执行所有的任务
        void RunAllTask();
        // 判断当前的线程是否是Event_LOOP对应的线程
        bool IsCurThread();
        // 创建event_fd
        static int CreateEventFd();
        // 读取计数器（_event_fd）
        void ReadEventFd();
        // 唤醒被阻塞的epoll
        void WeakUpEventFd();
        // 压入任务队列
        void PushTask(const functor& func);
        // 判断当前的线程是否是Event_LOOP对应的线程，是则执行，不是则压入任务队列
        void RunLoop(const functor& cb);
        // 添加/修改描述符监控
        void UpdateEvent(Channel *channel);
        // 移除修改描述符监控
        void RemoveEvent(Channel *channel);
        // 添加定时任务
        void AddTimerTask(uint64_t id,uint32_t delay,const Task_func& task_cb);
        // 更新/延迟定时任务
        void TimerRefresh(uint64_t id);      
        void TimerCancel(uint64_t id);
        bool HasTimer(uint64_t id);
    };

}